/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
/**
 *
 * Class: mxUrlConverter
 *
 * Converts relative and absolute URLs to absolute URLs with protocol and domain.
 */
var mxUrlConverter = function () {
  // Empty constructor
};

/**
 * Variable: enabled
 *
 * Specifies if the converter is enabled. Default is true.
 */
mxUrlConverter.prototype.enabled = true;

/**
 * Variable: baseUrl
 *
 * Specifies the base URL to be used as a prefix for relative URLs.
 */
mxUrlConverter.prototype.baseUrl = null;

/**
 * Variable: baseDomain
 *
 * Specifies the base domain to be used as a prefix for absolute URLs.
 */
mxUrlConverter.prototype.baseDomain = null;

/**
 * Function: updateBaseUrl
 *
 * Private helper function to update the base URL.
 */
mxUrlConverter.prototype.updateBaseUrl = function () {
  this.baseDomain = location.protocol + "//" + location.host;
  this.baseUrl = this.baseDomain + location.pathname;
  var tmp = this.baseUrl.lastIndexOf("/");

  // Strips filename etc
  if (tmp > 0) {
    this.baseUrl = this.baseUrl.substring(0, tmp + 1);
  }
};

/**
 * Function: isEnabled
 *
 * Returns <enabled>.
 */
mxUrlConverter.prototype.isEnabled = function () {
  return this.enabled;
};

/**
 * Function: setEnabled
 *
 * Sets <enabled>.
 */
mxUrlConverter.prototype.setEnabled = function (value) {
  this.enabled = value;
};

/**
 * Function: getBaseUrl
 *
 * Returns <baseUrl>.
 */
mxUrlConverter.prototype.getBaseUrl = function () {
  return this.baseUrl;
};

/**
 * Function: setBaseUrl
 *
 * Sets <baseUrl>.
 */
mxUrlConverter.prototype.setBaseUrl = function (value) {
  this.baseUrl = value;
};

/**
 * Function: getBaseDomain
 *
 * Returns <baseDomain>.
 */
(mxUrlConverter.prototype.getBaseDomain = function () {
  return this.baseDomain;
}),
  /**
   * Function: setBaseDomain
   *
   * Sets <baseDomain>.
   */
  (mxUrlConverter.prototype.setBaseDomain = function (value) {
    this.baseDomain = value;
  }),
  /**
   * Function: isRelativeUrl
   *
   * Returns true if the given URL is relative.
   */
  (mxUrlConverter.prototype.isRelativeUrl = function (url) {
    return (
      url.substring(0, 2) != "//" &&
      url.substring(0, 7) != "http://" &&
      url.substring(0, 8) != "https://" &&
      url.substring(0, 10) != "data:image" &&
      url.substring(0, 7) != "file://"
    );
  });

/**
 * Function: convert
 *
 * Converts the given URL to an absolute URL with protol and domain.
 * Relative URLs are first converted to absolute URLs.
 */
mxUrlConverter.prototype.convert = function (url) {
  if (this.isEnabled() && this.isRelativeUrl(url)) {
    if (this.getBaseUrl() == null) {
      this.updateBaseUrl();
    }

    if (url.charAt(0) == "/") {
      url = this.getBaseDomain() + url;
    } else {
      url = this.getBaseUrl() + url;
    }
  }

  return url;
};
